#include <stdio.h>

#define N 8
int board[N][N] = {0};

int is_safe(int row,int col)
{   
    // 为什么不检查同一行？？？？
    // for (int i = 0;i < col;i++)    
    // {
    //     if (board[row][i] == 1)  return 0;
    // }
    for (int j = 0;j < row;j++)
    {
        if (board[j][col] == 1) return 0;
    }
    for (int i = row-1,j = col - 1;i >= 0&&j >= 0;i--,j--)
    {
        if (board[i][j] == 1)   return 0;
    }
    for (int i = row-1,j = col + 1;i >= 0&&j < N;i--,j++)
    {
        if (board[i][j] == 1)   return 0;
    }
    return 1;
}

void solve(int row)
{
    // 已经排列完成，打印输出结果
    if (row == N)
    {
        for (int i = 0;i < N;i++)
        {
            for (int j = 0;j < N;j++)
            {
                printf("%d ",board[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        return;
    }

    // 利用for 循环遍历当前行每一个位置，直到可以放置皇后

    for (int k = 0;k < N;k++)
    {
        // 对于同一行的每一个元素，都进行尝试，如果可以放置，那么就放一个皇后
        
        if (is_safe(row,k))    // 当整行循环跑完，仍然没有安全位置时会直接返回
        {
            board[row][k] = 1;  // 赋值为一来放置皇后
            solve(row+1);       // 这行放完了，马上开启下一行
            board[row][k] = 0;  // 如果里层递归没有安全位置，那么就取消这次放置
            // 从1开始，逐行往下执行，如果执行到N的话，说明已经出去了，直接输出
        }
    }
    // 设计非常巧妙，不愧是经典问题
    
}

int main()
{
    char *name = "Roge";
    char *arr[] = {0};
    arr[0] = "Buenos";
    printf("%s\n",arr[0]);
    printf("%s\n",name);

    solve(0);
    return 0;
}